function isPureNumber(input) {
  return /^\d+$/.test(input);
}

var app = getApp();

Page({
  data: {
    paras: [
      { "id": 0, "name": "欠压保护",      "value":0,"sendvalue":0,"index": 53, "datatype":0,"Comments":"电池电压低于该值无动力\n单位:V","condition":true,"checked":true},
      { "id": 1, "name": "降额电压",      "value":0,"sendvalue":0,"index": 62, "datatype":0,"Comments":"电池电压低于该值动力降额\n单位:V","condition":true,"checked":true},
      { "id": 2, "name": "过压保护",      "value":0,"sendvalue":0,"index": 52, "datatype":0,"Comments":"电池电压高于该值无动力\n单位:V","condition":true,"checked":true},
      { "id": 3, "name": "失速保护",      "value":0,"sendvalue":0,"index": 51, "datatype":0,"Comments":"转速高于该值无动力\n单位:rpm","condition":true,"checked":true},
      { "id": 4, "name": "EBS最大反充电压",   "value":0,"sendvalue":0,"index": 64, "datatype":1,"Comments":"电池电压高于该值暂停EBS反充\n单位:V","condition":true,"checked":true},
      { "id": 5, "name": "EBS最大反充电流",   "value":0,"sendvalue":0,"index": 4, "datatype":0,"Comments":"EBS最大允许充电电流\n单位:A","condition":true,"checked":true},
      { "id": 6, "name": "油门低阀值",      "value":0,"sendvalue":0,"index": 17, "datatype":1,"Comments":"油门电压低于该值无动力\n单位:V","condition":true,"checked":true},
      { "id": 7, "name": "油门高阀值",      "value":0,"sendvalue":0,"index": 16, "datatype":1,"Comments":"油门电压高于该值全动力\n单位:V","condition":true,"checked":true},
      { "id": 8, "name": "油门扭矩上升速率",   "value":0,"sendvalue":0,"index": 20, "datatype":0,"Comments":"油门扭矩上升速率\n单位:Nm/S","condition":true,"checked":true},
      { "id": 9, "name": "油门扭矩下降速率",   "value":0,"sendvalue":0,"index": 21,   "datatype":0,"Comments":"油门扭矩下降速率\n单位:Nm/S","condition":true,"checked":true},

      { "id": 10, "name": "高速最大转速",    "value":0,"sendvalue":0,"index": 6,   "datatype":0,"Comments":"高速档电机最大转速\n单位:rpm","condition":true,"checked":true},
      { "id": 11, "name": "中速最大转速",    "value":0,"sendvalue":0,"index": 7,  "datatype":0,"Comments":"中速档电机最大转速\n单位:rpm","condition":true,"checked":true},
      { "id": 12, "name": "低速最大转速",    "value":0,"sendvalue":0,"index": 8,  "datatype":0,"Comments":"低速档电机最大转速\n单位:rpm","condition":true,"checked":true },
      { "id": 13, "name": "倒车最大转速",    "value":0,"sendvalue":0,"index": 9,  "datatype":0,"Comments":"倒车档电机最大转速\n单位:rpm","condition":true,"checked":true },
      { "id": 14, "name": "高速母线电流比例",    "value":0,"sendvalue":0,"index": 42,   "datatype":0,"Comments":"电池最大放电电流*该系数\n单位:%","condition":true,"checked":true},
      { "id": 15, "name": "中速母线电流比例",    "value":0,"sendvalue":0,"index": 43,   "datatype":0,"Comments":"电池最大放电电流*该系数\n单位:%","condition":true,"checked":true},
      { "id": 16, "name": "低速母线电流比例",    "value":0,"sendvalue":0,"index": 44,   "datatype":0,"Comments":"电池最大放电电流*该系数\n单位:%","condition":true,"checked":true},
      { "id": 17, "name": "高速相电流比例",   "value":0,"sendvalue":0,"index": 227, "datatype":0,"Comments":"电机峰值相电流*该系数\n单位:%","condition":true,"checked":true},
      { "id": 18, "name": "中速相电流比例",   "value":0,"sendvalue":0,"index": 228, "datatype":0,"Comments":"电机峰值相电流*该系数\n单位:%" ,"condition":true,"checked":true},
      { "id": 19, "name":"低速相电流比例",   "value":0,"sendvalue":0,"index": 229, "datatype":0,"Comments":"电机峰值相电流*该系数\n单位:%","condition":true,"checked":true},
      { "id": 20, "name": "油门启动增强比例",  "value":0,"sendvalue":0,"index": 23,   "datatype":0,"Comments":"增强油门的起动力\n单位:%","condition":true,"checked":true},
      { "id": 21, "name": "换挡方式",       "value":0,"sendvalue":0,"index": 247, "datatype":1,"Comments":"0:拨档   1:高速点动\n2:低速-高速+  3:中控","condition":true,"checked":true},
      { "id": 22, "name": "Boost电流",    "value":0,"sendvalue":0,"index": 253, "datatype":0,"Comments":"Boost电流\n单位:A","condition":true,"checked":true},
      { "id": 23, "name": "仪表选择",         "value":0,"sendvalue":0,"index": 257,   "datatype":1,"Comments": "0:无  1~99:一线通\n 100:霍尔仪表","condition":true,"checked":true },
      { "id": 24, "name": "通讯仪表车速调整系数",   "value":0,"sendvalue":0,"index": 226, "datatype":0, "Comments":"通讯仪表车速调整系数","condition":true,"checked":true },
      { "id": 25, "name": "霍尔仪表车速调整系数", "value":0,"sendvalue":0,"index": 14, "datatype":0,"Comments":"霍尔仪表车速显示系数","condition":true,"checked":true},
      { "id": 26, "name": "自动进P时间",       "value":0,"sendvalue":0,"index": 219, "datatype":1,"Comments":"停车后自动进入P档时间\n单位:秒","condition":true,"checked":true },
      { "id": 27, "name": "用户蓝牙密码",       "value":0,"sendvalue":0,"index": 224, "datatype":1,"Comments":"设置密码长度请勿超过6位！","condition":true,"checked":true },

    ],

    viewdata:new Int32Array(16),
    initflag:false,//读取初始数据标志
    sendreq:false,//发送请求
    learnreq:false,//自学习请求
    idx:0,
    index:0,//偏移地址
    sendvalue:0,
    mscount:0,
  },
  onShow: function () {
    wx.setKeepScreenOn({keepScreenOn: true});//常亮
    this.interval =setInterval(this.updataview, 250);//报文周期处理，200ms周期
    this.data.idx = 0;
    this.data.mscount = 0;
   // this.data.initflag= false;//每次进入该页面都刷新读取一次,为了增加体验，这个先不要了。
  },
  onHide: function () { 
    wx.setKeepScreenOn({keepScreenOn: false});//关闭常亮   
    clearInterval(this.interval);
    this.data.idx = 0;
    this.data.mscount = 0;
  //  this.data.initflag= false;
  },
  onUnload: function () { 
    wx.setKeepScreenOn({keepScreenOn: false});//关闭常亮   
    clearInterval(this.interval);
    this.data.idx = 0;
    this.data.mscount = 0;
  //  this.data.initflag= false;
  },


  onChange(event)  {
    // 需要手动对 checked 状态进行更新
    if(this.data.initflag==false)return;
    if(this.data.sendreq==true)return;
    if(app.data.LOGOK==false)return;
    var Updatapara = this.data.paras;
    const id = parseInt(event.currentTarget.dataset.id, 10); // 将data-id转换为数字类型
    Updatapara[id].checked = event.detail;

    this.setData({paras:Updatapara});

    if(Updatapara[id].checked){
      Updatapara[id].sendvalue=1;
      Updatapara[id].value = 1;
    }
    else{
      Updatapara[id].sendvalue=0;
      Updatapara[id].value = 0;
    }

    this.data.index     = Updatapara[id].index;
    this.data.sendvalue = Updatapara[id].sendvalue;
    app.data.Rebuffi = 0;//接收区数据清零
    this.data.sendreq = true;//发送请求有效

    if(Updatapara[id].checked){
      wx.showToast({
        title: '功能打开',
        icon: 'none', // 提示框的图标，可选值：'success', 'loading', 'none'（默认值）
        duration: 1000, // 提示框显示时间（毫秒），默认值为 1500
        mask: true // 是否显示透明蒙层，避免触摸穿透，可选值：true，false（默认值）
      })
    }
    else{
      wx.showToast({
        title: '功能关闭',
        icon: 'none', // 提示框的图标，可选值：'success', 'loading', 'none'（默认值）
        duration: 1000, // 提示框显示时间（毫秒），默认值为 1500
        mask: true // 是否显示透明蒙层，避免触摸穿透，可选值：true，false（默认值）
      })
    }
  },
  
  editTodo: function (e) {
    let that = this;
    const id = parseInt(e.currentTarget.dataset.id, 10); // 将data-id转换为数字类型
    var Updatapara = that.data.paras;
    if(that.data.initflag==false)return;
    if(app.data.LOGOK==false)return;
    // 根据id获取对应的待办事项，并进行编辑操作，可跳转到编辑页面或弹出编辑窗口
    // 示例代码：跳转到编辑页面

    wx.showModal({
      title: Updatapara[id].Comments,
      content: '',
      showCancel: true,
      confirmText: '确定',
      cancelText: '取消',
      editable:true,
      type: 'number',
      success: function (res) {
        if (res.confirm) {
          console.log('用户点击确定');
          console.log('输入的数值为：'+ res.content);
          // 在这里可以处理用户输入的数值
          var parsedFloat = parseFloat(res.content);
          var parsedInt = parseInt(res.content);
          if (!isNaN(parsedFloat) || !isNaN(parsedInt))
          {
              Updatapara[id].value =res.content;//输入的字符串转成10进制,当前参数的id，当前参数的值。
              Updatapara[id].sendvalue = Updatapara[id].value;
              that.setData({paras:Updatapara});
        
              if((id==6)||(id==7)){//油门下发值特殊处理
                Updatapara[id].sendvalue = ((Updatapara[id].value/5)*4096).toFixed(0);//转换成AD整数
              }

              if((id>=14)&&(id<=20)){//电流比例下发值特殊处理
                Updatapara[id].sendvalue = (Updatapara[id].value/100).toFixed(2);//100%转换成1
              }

              that.data.index     = Updatapara[id].index;
              that.data.sendvalue = Updatapara[id].sendvalue;

              if(Updatapara[id].datatype==0)//Q16格式特殊化处理
              {
                that.data.sendvalue = Updatapara[id].sendvalue*65536;
              }

              that.setData({paras:Updatapara});

              app.data.Rebuffi = 0;//接收区数据清零
              that.data.sendreq = true;//发送请求有效

              wx.showToast({
                title: '正在写入',
                icon: 'none', // 提示框的图标，可选值：'success', 'loading', 'none'（默认值）
                duration: 1000, // 提示框显示时间（毫秒），默认值为 1500
                mask: true // 是否显示透明蒙层，避免触摸穿透，可选值：true，false（默认值）
              })
              

          }
          else{//提示非数字输入
            wx.showToast({
              title: '无效输入',
              icon: 'none', // 提示框的图标，可选值：'success', 'loading', 'none'（默认值）
              duration: 2000, // 提示框显示时间（毫秒），默认值为 1500
              mask: true // 是否显示透明蒙层，避免触摸穿透，可选值：true，false（默认值）
            })
          }

        } else if (res.cancel) {
          console.log('用户点击取消');
        }
      },
    })

  },

  /**200ms周期执行 */
  updataview(){

       if(app.data.bleopen==false)
        {
          app.data.connecttips = '正在打开蓝牙'
          app.data.bleopen = true
          app.data.blefound = false;//清除蓝牙找到标志
          app.openBluetoothAdapter()
        }
        if(app.data.connected==false && app.data.blefound==true )//蓝牙没连接，但已找到
        {
          app.data.connecttips = '正在连接'
          app.createBLEConnection()//自动连接蓝牙
          this.data.initflag = false;//参数重新读取初始化
          this.data.indx=0;
        }
        if(app.data.connected==false)return;//蓝牙未连接，直接返回

        if(app.data.advaninitreq ==1)//页面更新请求
        {
          app.data.advaninitreq =0;
          this.data.idx = 0;
          this.data.mscount = 0;
          this.data.initflag= false;//电池电压被修改，重新读取列表
        }

        if(this.data.mscount<1)//等待1个周期。
        {
          this.data.mscount++;
          this.data.idx = 0;
          app.data.Rebuffi=0;//清空接收的数据,防止别的页面也换过来没有情况缓存区
          return;
        }

   
      
        if(this.data.initflag==false)//参数读取未初始化
        {
          app.data.mscount++;
          if(app.data.mscount>20)//确认断连
          {
            app.data.mscount = 0;
            app.data.connected=false;//断连，重新连接
          }
          if((app.data.Rebuffi == 0)&&(app.data.mscount>5))//接收的数据为空
          {
            wx.showToast({
              title: '控制器未应答',
              icon: 'none', // 提示框的图标，可选值：'success', 'loading', 'none'（默认值）
              duration: 500, // 提示框显示时间（毫秒），默认值为 1500
              mask: true // 是否显示透明蒙层，避免触摸穿透，可选值：true，false（默认值）
            })
          }
          else{
            wx.showToast({
              title: '列表显示更新中...'+this.data.idx+'/27',//显示当前更新进度
              icon: 'none', // 提示框的图标，可选值：'success', 'loading', 'none'（默认值）
              duration: 1000, // 提示框显示时间（毫秒），默认值为 1500
              mask: true // 是否显示透明蒙层，避免触摸穿透，可选值：true，false（默认值）
            })
          }
          if((app.data.Rebuffi>0) && (app.data.BLE_Rebuff[1]==3))//读数据应答，9个字节
          {
            var crc = app.crc16(app.data.BLE_Rebuff,app.data.Rebuffi);
            if(crc==0)//crc校验通过
            {
               var Updatapara = this.data.paras;
               var idupdata   = this.data.idx;
               this.data.viewdata[idupdata] = ((app.data.BLE_Rebuff[3]<<8)+app.data.BLE_Rebuff[4])+(((app.data.BLE_Rebuff[5]<<8)+app.data.BLE_Rebuff[6])<<16)//组合值
                Updatapara[idupdata].sendvalue =  this.data.viewdata[idupdata];
                Updatapara[idupdata].value = Updatapara[idupdata].sendvalue;
                if((idupdata==6)||(idupdata==7)){//油门显示值特殊处理，转换成AD
                  Updatapara[idupdata].value =  ((Updatapara[idupdata].sendvalue*5.0/4096)).toFixed(2)//AD转换为电压，保留2位小数
                }
                if((idupdata>=14)&&(idupdata<=20)){//100%系数显示值特殊处理，1转换成100
                  Updatapara[idupdata].value = Updatapara[idupdata].sendvalue*100;
                  Updatapara[idupdata].sendvalue = Updatapara[idupdata].value; 
                }

                if(Updatapara[idupdata].datatype == 0)//IQ16
                {
                  Updatapara[idupdata].value = (Updatapara[idupdata].sendvalue/65536).toFixed(1) //显示值
                }
                if(Updatapara[idupdata].value==0){//开关显示
                  Updatapara[idupdata].checked =false
                }
                else{
                  Updatapara[idupdata].checked =true
                }
                

                this.data.idx++;//读取下一个
                app.data.crcerrcnt = 0;
                this.setData({//刷新显示页面
                  paras:Updatapara
                });

            }
            else{
              app.data.crcerrcnt++;
            }
          }
          app.data.Rebuffi = 0;//清零接收
          if(this.data.idx<this.data.paras.length)//应答的参数，小于当前元素个数
          {//发送当前下标读取数据指令
            
           
            var Updatapara = this.data.paras;
            var addr = Updatapara[this.data.idx].index;//读取的偏移地址,注意这个是excel表中的行数
         
            app.data.BLE_Txbuff[0]= 0x01
            app.data.BLE_Txbuff[1]= 0x03
            app.data.BLE_Txbuff[2]= ((addr-2)*2)>>8;//高8位地址
            app.data.BLE_Txbuff[3]= ((addr-2)*2)&0x00FF;//低8位地址
            app.data.BLE_Txbuff[4]= 0x00
            app.data.BLE_Txbuff[5]= 0x02
            var crc = app.crc16(app.data.BLE_Txbuff,6);
            app.data.BLE_Txbuff[6]= (crc>>8)&0xFF
            app.data.BLE_Txbuff[7]= (crc)&0xFF

            app.data.Txbuffid = 0;
            app.writeBLECharacteristicValue()
          }
          else{//初始化已经完成

            app.data.Rebuffi = 0;
            this.data.initflag=true;
            wx.showToast({
              title: '已更新',
              icon: 'none', // 提示框的图标，可选值：'success', 'loading', 'none'（默认值）
              duration: 500, // 提示框显示时间（毫秒），默认值为 1500
              mask: true // 是否显示透明蒙层，避免触摸穿透，可选值：true，false（默认值）
            })


          }  
        }
        if(this.data.initflag==false)return;//未完成初始参数读取，直接返回。

        if((this.data.sendreq == true) && (this.data.learnreq==false))//存在参数写入请求,且不在自学习中。
        {
          if((app.data.Rebuffi>0))//写数据应答，8个字节
          {
            var crc = app.crc16(app.data.BLE_Rebuff,app.data.Rebuffi);
            if(crc==0){//crc校验通过
                app.data.Rebuffi = 0;//清零接收缓存区。
                this.data.sendreq=false;//取消写请求 return;
                app.data.savetirg = true;//存储请求
                return
            }
          }

          var Updatapara = this.data;
          var addr = Updatapara.index;//写入的偏移地址,注意这个是excel表中的行数
          var sendata = Updatapara.sendvalue;//发送的数据
          
          app.data.BLE_Txbuff1[0]= 0x01
          app.data.BLE_Txbuff1[1]= 0x10
          app.data.BLE_Txbuff1[2]= ((addr-2)*2)>>8;//高8位地址
          app.data.BLE_Txbuff1[3]= ((addr-2)*2)&0x00FF;//低8位地址
          app.data.BLE_Txbuff1[4]= 0x00
          app.data.BLE_Txbuff1[5]= 0x02
          app.data.BLE_Txbuff1[6]= 0x00
          app.data.BLE_Txbuff1[7]= (sendata>>8)&0x00FF
          app.data.BLE_Txbuff1[8]= (sendata)&0x00FF
          app.data.BLE_Txbuff1[9]= (sendata>>24)&0x0FF
          app.data.BLE_Txbuff1[10]=(sendata>>16)&0X0FF
          var crc = app.crc16(app.data.BLE_Txbuff1,11);

          app.data.BLE_Txbuff1[11]= (crc>>8)&0x0FF
          app.data.BLE_Txbuff1[12]= (crc)&0x0FF

          app.data.Txbuffid = 1;//写入类型
          app.writeBLECharacteristicValue()
        }

        if(app.data.savetirg ==true)
        {
          app.data.mscount++;
          if(app.data.mscount>20)//确认断连
          {
            app.data.mscount = 0;
            app.data.connected=false;//断连，重新连接
          }
          if((app.data.Rebuffi == 0)&&(app.data.mscount>5))//接收的数据为空
          {
            wx.showToast({
              title: '控制器未应答',
              icon: 'none', // 提示框的图标，可选值：'success', 'loading', 'none'（默认值）
              duration: 500, // 提示框显示时间（毫秒），默认值为 1500
              mask: true // 是否显示透明蒙层，避免触摸穿透，可选值：true，false（默认值）
            })
          }
          if((app.data.Rebuffi>0) && (app.data.BLE_Rebuff[1]==16))//写应答
          {
            var crc = app.crc16(app.data.BLE_Rebuff,app.data.Rebuffi);
            if(crc==0)//crc校验通过
            {
              app.data.savetirg = false;
              app.data.crcerrcnt = 0;
              wx.showToast({
                title: '设置成功！',
                icon: 'none', // 提示框的图标，可选值：'success', 'loading', 'none'（默认值）
                duration: 500, // 提示框显示时间（毫秒），默认值为 1500
                mask: true // 是否显示透明蒙层，避免触摸穿透，可选值：true，false（默认值）
              })
            }
            else{
              app.data.crcerrcnt++;
            }
          }
          else
          {
            this.savetirg();//存储触发
          }
          app.data.Rebuffi = 0;//清零接收

        }
  },

  savetirg()
  {
    var addr = 273;
    app.data.BLE_Txbuff1[0]= 0x01
    app.data.BLE_Txbuff1[1]= 0x10
    app.data.BLE_Txbuff1[2]= ((addr-2)*2)>>8;//高8位地址
    app.data.BLE_Txbuff1[3]= ((addr-2)*2)&0x00FF;//低8位地址
    app.data.BLE_Txbuff1[4]= 0x00
    app.data.BLE_Txbuff1[5]= 0x02
    app.data.BLE_Txbuff1[6]= 0x00
    app.data.BLE_Txbuff1[7]= 0
    app.data.BLE_Txbuff1[8]= 0
    app.data.BLE_Txbuff1[9]= 0
    app.data.BLE_Txbuff1[10]=0
    var crc = app.crc16(app.data.BLE_Txbuff1,11);

    app.data.BLE_Txbuff1[11]= (crc>>8)&0xFF
    app.data.BLE_Txbuff1[12]= (crc)&0xFF

    app.data.Txbuffid = 1;//写入类型
    app.writeBLECharacteristicValue()
  }
  
})